<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+

/*!
 * @page ViewQuestionPagePage Исходный код класса ViewQuestionPage
 * @include view_question_page.class.php
 */

/*! @addtogroup ClassWebFormsQA Основные классы проекта
 *  Группа включает основные классы используемые в проекте WebFormsQA
 *  @{
 */


/**
 * @class ViewQuestionPage 
 * @brief страница для отображения вопросов в выбранной категории \n
 * @ref ViewQuestionPagePage
 */
class ViewQuestionPage extends Page {

    /**
     *  конструктор.
     *  @param object &$smarty_obj   - ссылка на обьект шаблона
     *  @param array  $attr          - массив атрибутов в формате attr["name"] = name_type;
     *  @param string $name_template - название шаблона
     */
    function ViewQuestionPage(&$smarty_obj, $attr, $name_template)
    {
        parent::Page(&$smarty_obj, $attr, $name_template);
    }

    /** 
     * @brief обновить данные страницы
     *
     *    	Состояния страницы:
     * - 0    -   начальное состояние 
     * - 1    -   не выбрана не одна из категорий, вывод сообщения не выбрана ни одна из категорий
     *            вывод всех вопросов во всех категориях, сначала с ответами, потом без
     * - 2    -   категория выбрана, вывод списка вопросов выбранной категории
     * - 3    -   в выбранной категории нет ни одного вопроса            
     * - 4    -   не найдено ни одного вопроса
     * - 5    -   режим поиска, ничего не найдено   
     * - 6    -   режим поиска, длина фразы меньше 3 символов
     * - 7    -   режим поиска, пользователю предоставляются результаты   
     * 
     * @return bool результат операции
     */
    function update()
    {

        // обновляем атрибуты страницы и их значения
        // и главный шаблон Smarty
        if( $flag_result = parent::update() ) {

            $base   = &$GLOBALS['base'];
            $nav    = new Navigation($base);

            $state      = 0;
            $email      = "";
            $question   = "";
            $categoryID = 0;
            $navigator  = "";
            $offset     = 0;
            $num_find   = 0;
            $find_field = "";
            $link_all 	= "";
            $mode_search= 3;   
            $current_category 	= "";
            $anchor_location	= "";
            $display_only_question = false;
            $select_question = 0;
            

            $list_questions = array();
            // дерево категорий
            $categories_tree = array();
            reset($this->attr);
	        // ключ перехода на страницу
            $key_page 	= key($this->attr);
            $request 	= "index.php?".$key_page."&";

            $code_search = $this->checkSearch( $base, $list_questions, $num_find, $find_field, $mode_search );

            if( AuthCommon::getAttrCategoryIDandSession($this, $categoryID) ) {
				$code_search 	= 0;
				// при выборе категории предыдущий поиск обнуляю
				if( isset( $_SESSION['find_field'] ) ) unset( $_SESSION['find_field'] );
				if( isset( $_SESSION['mode_search'] ) ) unset( $_SESSION['mode_search'] );
            }
            
            if( $code_search == 0 ) {
	            if( $categoryID ) {
	                $state 		= 2;
	                $request 	= "index.php?".$key_page."&categoryID=$categoryID&";
	                $num_find 	= $base->getAllCategoryQuestions($categoryID, $list_questions);
	                if( !$num_find ) $state = 3;
	                
	            } else {
	                // ничего не выбрано, отображаем корневые категории
	                $state   	= 1;
		            // ищу список всех вопросов
		          	$num_find 	= $base->getAllQuestions($list_questions);
		          	if( !$num_find ) $state = 4;
	            }
            } else {
				// для наглядности явно присваиваю код состояния
            	switch( $code_search ) {
            		case 1:		$state = 5;		break;		
            		case 2:		$state = 6;		break;
            		case 3: 	$state = 7;		break;
            	}
            	 	
            }
            
            if( $state == 2 || $state == 3 ) {
            	// ссылка выбора всех вопросов во всех категориях
            	$link_all = "<a href=index.php?".$key_page."&categoryID=0> ".LINK_ALL_QUESTION."</a>";
            }


            if( $num_find ) {
            	// вопросы есть, формирую строку навигатора
                if( $this->attr['offset']['set'] ) $offset = $this->attr['offset']['value'];
                
                // определяем строку навигатора
                if( $nav->getNavigator($num_find, $offset, COUNT_QUESTIONS_PER_PAGE, $request, $navigator) ) {
                    // изменен диапазон навигатора
                    // формируем диапазон вопросов для отображения, а не весь список
                    $list_questions = &$nav->selectRange($offset, $offset + COUNT_QUESTIONS_PER_PAGE,
                                                         $list_questions, $num_find, $list_out);
                }
            }
            

            // получаем дерево категорий
            $nav->getTreeCategories($categoryID, CATEGORIES_TABLE, $categories_tree);
            
            if( $state == 2 ) {
            	// ищу имя текущей категории 
            	for ($i = 0; $i < count($categories_tree); $i++) {
            		if( $categoryID == $categories_tree["$i"][0] ) {
            			$current_category = $categories_tree["$i"][1];
            			break;		
            		} 
            	}
            }
            

            // явно формирую переход к якорю у выбранной ссылке, для прокрутки страницы 
            if( $this->attr["questionID"]["set"] ) {
           		$tmp_val = $this->attr["questionID"]["value"]; 
           		if( $tmp_val ) {
           			$anchor_location = "questionID".$tmp_val;
           			$select_question = $tmp_val;
           		}
            }

            // обработка дополнительных параметров отображения
            if( $this->attr["display_only_question"]["set"] ) {
            	$tmp_val = $this->attr["display_only_question"]["value"];
           		$display_only_question 				= $tmp_val;
				$_SESSION['display_only_question'] 	= $tmp_val;
            } else if( isset($_SESSION['display_only_question']) ) {
            	$display_only_question = $_SESSION['display_only_question'];
            }

            $this->Smarty->assign("state", $state);
            $this->Smarty->assign("current_category", $current_category);
            $this->Smarty->assign("current_tabs", ID_PAGE_VIEW_QUESTION);
            // строка с главным параметром перехода на страницу - первый ключ в списке конструктора MainPage
            $this->Smarty->assign("code_page", "index.php?".$key_page);
            $this->Smarty->assign("categoryID", $categoryID);
			$this->Smarty->assign("num_find", $num_find);
			$this->Smarty->assign("find_field", $find_field);
			$this->Smarty->assign("mode_search", $mode_search);
			$this->Smarty->assign("anchor_location", $anchor_location);
			$this->Smarty->assign("display_only_question", $display_only_question);
			$this->Smarty->assign("select_question", $select_question);

            // строка навигатора
            $this->Smarty->assign('navigator', $navigator);
            $this->Smarty->assign('offset', $offset);
            $this->Smarty->assign('link_all', $link_all);
            
            $this->Smarty->assign("list_questions", $list_questions);
            $this->Smarty->assign("categories_tree", $categories_tree);

        }
        
        return $flag_result;

    } // end update()
    
    /*! метод определяет включен ли режим поиска введенной фразы
     * @param object &$base				- ссылка на объект, работающий с базой данных WebFormsQA
     * @param array &$list_questions    - ссылка на структуру, в которую будут записаны найденные записи
     * @param integer &$num_find    	- количество найденных записей 
     * @param string  &$find_field		- возвращается фраза для поиска
     * @param integer &$mode			- возвращается режим поиска
     * @param bool $flagUtf8			- признак использования кодировки UTF-8, иначе cp1251
     * @return код операции: 
     * - 						0	- нет поиска 
     * -						1   - режим поиска, ничего не найдено
     * - 						2   - режим поиска, длина фразы меньше 3 символов
     * - 						3   - режим поиска, пользователю предоставляются результаты
     */
    function checkSearch( &$base, &$list_questions, &$num_find, &$find_field, &$mode, $flagUtf8=true ) 
    {
    	
        // сохраняю поле поиска в переменной сессии, пока пользователь явно не выберет категорию        
        if( $this->attr["find_field"]["set"] ) {
        	$find_field = $this->attr["find_field"]["value"];
            $_SESSION['find_field'] = $find_field;             
        } else if( isset( $_SESSION['find_field'] ) ) {
        	$find_field = $_SESSION['find_field'];
        } else {
       		return 0;
        }

		$encoding="";
		if( flagUtf8 ) $encoding="utf-8";
		else $encoding="cp1251";
		

        if( !$find_field ) return 0;
        if( mb_strlen($find_field, $encoding) < 3 ) return 2;
        
        // режим поиска        
        if( $this->attr["mode_search"]["set"] ) {
        	$mode = $this->attr["mode_search"]["value"];
        	$_SESSION['mode_search'] = $mode;
        } else if( isset( $_SESSION['mode_search'] ) ) $mode = $_SESSION['mode_search'];
        else $mode = 3; // поиск по умолчанию и в вопросах и в ответах 

        
        
        
    	$search     = new SearchQuestion($base);
        $flag_order = true;
        $search->searchPhraseInQuestionAnswer( $mode, $find_field, $list_questions, $flag_order );
        $num_find = sizeof( $list_questions );
        
     	if( !$num_find ) return 1;
        return 3;    	
    }

}  // finish class ViewQuestionPage

/*! @} */

?>
